package com.jhgsys.internal.system.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jhgsys.internal.common.entity.QueryRequest;
import com.jhgsys.internal.system.dto.UserDto;
import com.jhgsys.internal.system.entity.Dept;
import com.jhgsys.internal.system.entity.User;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * @author MrBird
 */
public interface IUserService extends IService<User> {

    /**
     * 通过用户名查找用户
     *
     * @param username 用户名
     * @return 用户
     */
    User findByName(String username);

    /**
     * 根据部门id查询部门负责人
     *
     * @param deptId 部门id
     * @return 用户
     */
    User findLeaderByDeptId(String deptId);

    /**
     * 通过用户id查找用户
     *
     * @param userId 用户id
     * @return 用户
     */
    User findById(String userId);

    /**
     * 查找用户详细信息
     *
     * @param request request
     * @param user    用户对象，用于传递查询条件
     * @return IPage
     */
    IPage<UserDto> findUserDetail(User user, QueryRequest request);

    /**
     * 根据关键字搜索
     * @param user
     * @return
     */
    List<UserDto> findUserByKeywords(UserDto user);

    /**
     * 通过用户名查找用户详细信息
     *
     * @param username 用户名
     * @return 用户信息
     */
    User findUserDetail(String username);

    /**
     * 通过用户id查找用户详细信息
     *
     * @param userId 用户名
     * @return 用户信息
     */
    User findUserDetailById(String userId);

    /**
     * 更新用户登录时间
     *
     * @param username 用户名
     */
    void updateLoginTime(String username);

    /**
     * 新增用户
     *
     * @param user user
     */
    void createUser(User user);

    /**
     * 删除用户
     *
     * @param userIds 用户 id数组
     */
    void deleteUsers(String[] userIds);

    /**
     * 修改用户
     *
     * @param user user
     */
    void updateUser(User user);

    /**
     * 修改用户启用/停用状态
     *
     * @param user user
     */
    void updateStatus(User user);

    /**
     * 重置密码
     *
     * @param userIds 用户id数组
     */
    void resetPassword(String[] userIds);

    /**
     * 注册用户
     *
     * @param username 用户名
     * @param password 密码
     */
    void regist(String username, String password);

    /**
     * 修改密码
     *
     * @param username 用户名
     * @param password 新密码
     */
    void updatePassword(String username, String password);

    /**
     * 更新用户头像
     *
     * @param username 用户名
     * @param avatar   用户头像
     */
    void updateAvatar(String username, String avatar);

    /**
     * 修改用户系统配置（个性化配置）
     *
     * @param username 用户名称
     * @param theme    主题风格
     * @param isTab    是否开启 TAB
     */
    void updateTheme(String username, String theme, String isTab);

    /**
     * 更新个人信息
     *
     * @param user 个人信息
     */
    void updateProfile(User user);

    /**
     * 删除用户信息
     * @since 2019-07-11
     * @author qiny
     */
    void updateUserDeletedFlg(String[] ids,User user);

    /**
     * 根据角色名查询角色主键id
     * @author qiny
     * @since 2019-07-18
     * @param roleName
     * @return
     */
    Long findRoleIdByRoleName(String roleName);

    IPage<User> findUserMail(User user, QueryRequest request);

    /**
     * 根据角色Id查询用户
     * @since 2019-07-18
     * @param roleId 角色Id
     * @param tenantId 租户Id
     * @return
     */
    List<User> findByRoleId(String roleId, String tenantId);

    /**
     * 根据用户Ids查询用户
     * @since 2019-07-18
     * @param userIds 角色Id
     * @return
     */
    List<User> findUserByUserIds(List<String> userIds);

    /**
     * 查询（所有）
     * @author fenghaijun
     * @date 2024-07-19 13:53:31
     * @param user user
     * @return List<User>
     */
    List<User> findUserList(User user);

    List<User> exportUsers(User user);

    /**
     * 获取部门下的user
     * @author dinght
     * @param deptId
     * @date 2024-08-13 13:11:12
     */
    List<User> deptUserList(String deptId);

    /**
     * 更新用户积分
     * @param user
     * @return
     */
    @Transactional(isolation = Isolation.READ_COMMITTED)
    boolean updateScore(User user);

    /**
     * 批量更新用户积分
     * @param userList
     * @return
     */
    @Transactional(isolation = Isolation.READ_COMMITTED)
    boolean updateBatchScore(List<User> userList);

    List<Map<String,String>>  getUserList();
}
